Now that we've gone through the trouble of making MooseX::TypeLibrary work 
correctly with parameterized types, along with the needed modifications to 
Moose (a lot of this still in repo, but working nonetheless) I was thinking we 
could use this to create some enhanced versions of our core constraints.  What 
I am thinking about is adding more declarative abilities to our core 
constraints, for example:

Str[MaxLength=>10]

which would do something similar to:

subtype MaxStr10, as Str, where { length $_ <= 10 }

I know I've done the above more than once, and I am sure I am not alone.  
Besides saving time and improving readability, there would be a lot of benefits 
to moving more information into introspectable meta data, which could be used 
in novel ways.

I think it would be ideal if we could cook up the most common constraint needs 
and build them into this system in a way that would be introspect able, that 
way they would play nice with systems like Ernst and Reaction which use 
attribute derived meta data to infer all sorts of neat things.  Also, for my 
own needs, I'd like to see something here that would play nice with ORMS like a 
future Moose version of DBIC, that way we could deploy tables and such from the 
data introspected from the constraints and attributes.

My hope here is to create something that would cover a high percentage of our 
normal constraint needs while offering usable meta data to systems like 
Reaction, Ernst, future DBICs, etc.  For me, I see this as a final constraint 
layer before information is sent off to Storage or used by my business logic.  
Although I am a web applications programmer, I don't really see this as 
something that sits in the role of form input validation, although it could be 
a basic layer upon which something like that is built (again I am thinking 
integration with Reaction and Ernst).  Because of that you will see I've models 
constraint options against SQL/XML Schema types as well as a few of the more 
common form validation types.

Given that I am asking for your thoughts and input as to how what options we 
want here.  In particular I hope to hear from some of the people responsible 
for the named projects (Reaction, Ernst, DBIC), since I am hoping to provide 
something useful to you.

These new constraints would be built on top of the to be version of 
MooseX::TypeLibrary.  Here's beginning list of options and their constraints, 
but please lets all think about how this could be done right.  I can see from 
looking around CPAN there's probably a dozen constraint oriented systems and 
I'm hoping to cherry pick code from all the best ideas out there.

Additionally, since our type constraints are arranged in a hierarchy, my 
intention is that the options would be inheritable.  Also, I added a few new 
core types.  I realize there may be some overlap, but I wanted to put all the 
ideas down (like 'OneOf' probably overlaps with Enum) Lastly, I am thinking it 
might be a good idea to have official aliases for many of the possible longer 
option names.  Hopefully the names I'm choosing are self explanatory, but once 
we all start to nail down the spec I'm add more details.

  Item[
        Default
  ]
      Bool
      Maybe[`a]
      Undef
      Defined
          Value[
                IsOneOf||Enum
          ]
              Num[
                                LessThanOrEqual || '<='
                                LessThan || '<'
                                GreaterThanOrEqual || '>='
                                GreaterThan || '>'
                                EqualTo || '='
                                Precision
                                Scale
              ]
                Int[
                        Signed
                        UnSigned
                ]
                        SmallInt
                        BigInt
              Str[
                ASCII
                Printable
                Word (must be a single 'word')
                MaxLength
                MinLength
                                EqualTo || 'eq'
              ]
                ClassName[
                        PackageBase (For stuff like '::Plugin::MyPlugin')
                ]
          Ref
              ScalarRef
              ArrayRef[`a][
                MaxElements
                MinElements
              ]
              HashRef[`a][
                HasAllKeys
              ]
              CodeRef
              RegexpRef
              GlobRef
                FileHandle
              Object[
                HasMethods
                ISA
              ]
                  Role[
                        Requires
                        Does
                  ]


This is just my first shot and there is obviously room for improvement, but I 
would like to kick off the conversation.  So what is missing?  Do we want to 
add more types, like for URIs, or fixed types like ZERO, INFINITY, etc.  
Declare-Constraints-Simple has some neat features for aggregating constraints 
(And, Or, Not, Xor, ect.)  We have Union, which covers Or, but maybe we'd like 
more.  Is there stuff here you think doesn't belong?  Does it belong in a 
separate project, or just doesn't belong period?  What other existing type 
constraints libraries might benefit from this approach?  For example, I've done 
a bit of work on MooseX::Types::DateTime[X] and was thinking this could be used 
to hint stuff like TimeZone information (ie isa=>DateTime[TZ=>'USA/Eastern'] 
and similar).

I know this is a lot to review, but I should be on IRC often for discussion.

Sincerely,
John Napiorkowski


      

Reply via email to