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