Re: defining my own parameterized types

[email protected] (Darren Duncan)
Newsgroups perl.moose
Message-ID <[email protected]>
Mark Wood-Patrick wrote:
> I would like to add my own parameterized type e.g. I would like to be 
> able to create types like:

Parameterized types are about looking at a value on its own and seeing if it 
qualifies as a member of the type, not about context of usage.

>             SzStr[32]
> 
> Which would allow me to specify the maximum size of a string that an 
> attribute can have and will validate the size of the data I’m storing in 
> the attribute

That one makes clear sense.

> Or to specify that an attribute is a secondary key in some DB like:
> 
>             DBKey[User]
> 
> Where User is a Moose class that provides an in memory version of a DB 
> record and the attribute would be a weak reference to such an object

This example is ambiguous as to what you meant, and only some resolutions of 
that ambiguity make sense.

1.  In a relational database, a key is a property of an entire table, or of a 
rowset, and not of an individual record.  A set of attributes/columns is a key 
in a rowset or table if every record has unique values there.  It doesn't make 
sense to look at an individual record and ask whether certain attributes/columns 
are keys because you don't have the context in which to judge it.  Or, in a 
trivial sense, where you look at a record as a rowset of a single row, every 
column is trivially unique and a key therein.

So in that case, your DBKey[User] would not be a constraint for a record object 
but rather for a recordset object.  Similar to if you had a UniqueArray Moose 
constraint that said the value is an array whose values are all unique.

2.  Now, if instead your record object has meta-data that says particular 
attributes/columns have key constraints in their database tables, then that 
makes more sense to be a Moose constraint insofar that you are just asking 
whether an attribute exists in a record marked with metadata saying it 
corresponds to a key column.

3.  If you are wanting your constraint in the second case to go further and 
check that your key attribute is unique against an external database, I don't 
think that this is what type constraints are for, parameterized or otherwise, 
and trying to use them that way is a design or conceptualization flaw.  Type 
constraints are supposed to be deterministic and not depend on variables (such 
as a mutable database) to determine whether they pass or not.  Another example 
of misusing a type constraint is having a constraint that says "this datestamp 
is within 3 seconds of the current systemtime".

I think it would help clear things up if you provided more details or clarified 
what you actually wanted the DBKey[User] example to achieve.

-- Darren Duncan
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.