TypeConstraint::Utils,.. now with find_or_create_type_constraint goodness
[gitmo/Moose.git] / PLANS
CommitLineData
d67145ed 1-----------------------------------------------------------
2-- Type Constraints refactor
3-----------------------------------------------------------
4
5- move the details of TC construction that are in Moose.pm and
6 Moose::Util::TypeConstraints into the Moose::Meta::TypeConstraint module
7
8This will make it much easier to generate TCs on their own, without
9having to use the sugar layer. This should also clean up their APIs
10as well, which will make it easier to subclass them.
11
d67145ed 12- allow a switch of some kind to optionally turn TC checking off at runtime
13
14The type checks can get expensive and some people have suggested that allowing
15the checks to be turned off would be helpful for deploying into performance
16intensive systems. Perhaps this can actually be done as an option to make_immutable?
17
22aed3c0 18- add support for locally scoped TC
19
20This would borrow from MooseX::TypeLibrary to prefix the TC with the name
21of the package. It would then be accesible from the outside as the fully
22scoped name, but the local attributes would use it first. (this would need support
23in the registry for this).
24
25- look into sugar extensions
26
27Use roles as sugar layer function providers (ala MooseX::AttributeHelpers). This
28would allow custom metaclasses to provide roles to extend the sugar syntax with.
29
30(NOTE: Talk to phaylon a bit more on this)
31
d67145ed 32- misc. minor bits
33
34* make the errors for TCs use ->message
35* look into localizing the messages too
36* make ANON TCs be lazy, so they can possibly be subsituted for the real thing later
37* make ANON TCs more introspectable
22aed3c0 38* add this ...
39
40#
41# Type Definition
42#
43subtype 'Username',
44 from 'Str',
45 where { (/[a-z][a-z0-9]+/i or fail('Invalid character(s)'))
46 and (length($_) >= 5 or fail('Too short (less than 5 chars)'))
47 }
48on_fail { MyException->throw(value => $_[0], message => $_[1]) };
49
50# fail() will just return false unless the call is made via
51$tc->check_or_fail($value);
52
53* and then something like this:
54
55subtype Foo => as Bar => where { ... } => scoped => -global;
56subtype Foo => as Bar => where { ... } => scoped => -local;
57
58# or
59
60subtype Foo => as Bar => where { ... } => in __PACKAGE__ ;
61
62# or (not sure if it would be possible)
63
64my $Foo = subtype Bar => where { ... };
d67145ed 65
d9b40005 66# ----------
67
68[17:10] <autarch> stevan: it should do it if I pass coerce => 1 as part of the attribute definition
69[17:12] <stevan> autarch: what I am not 100% sure of is how to tell it to deep coerce and when to not
70[17:13] <stevan> cause a basic coerce is from A to B
71[17:13] <autarch> hmm
72[17:13] <stevan> which is valid for collection types too
73[17:13] <stevan> deep coercion is what you are asking for
74[17:13] <autarch> yeah
75[17:13] <stevan> so perhaps we add deep_coerce => 1
76[17:13] <stevan> which will do it
77[17:13] <autarch> that's fine for me
78[17:13] <stevan> k
79
80-----------------------------------------------------------
81- TC stuff DONE
82-----------------------------------------------------------
83
84- create an official TC registry API (DONE)
85
86Right now the registration of the TC is a by-product of creation in the sugar
87layer, this is bad and make extension of TCs difficult. I am not sure if this
88registry API should exist as part of Moose::Util::TypeConstraints, or of we
89should create a complete registry object itself.
90
91This registry should be a singleton, but M::U::TC should enforce that lifecycle
92choice so that you can use your own registry if you really want too.
93
94I mean parent of the registry. So that I can create my own registry
95object for a given class, and any retrieval of a type constraint from
96this object would automatically search parent registries as well.
97
98- refactor the various TC internals to make it more subclassing friendly (DONE)
99
100This also includes the coercion stuff as well. This should give you what you
101need to make your object/class bound stuff.
102
103- move the container TCs from MooseX::AttributeHelpers into Moose core (DONE)
104
105These have proven so useful for me in the latest $work project that I think
106they should really be core.
d67145ed 107
108-----------------------------------------------------------
109-- Roles refactor
110-----------------------------------------------------------
111
112
113-----------------------------------------------------------
114-- Immutable refactor
115-----------------------------------------------------------