Can't coerce a type that doesn't define a coercion.
[gitmo/Moose.git] / TODO
diff --git a/TODO b/TODO
index 38386c1..8085167 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,33 +1,26 @@
 -------------------------------------------------------------------------------
- BUGS
-------------------------------------------------------------------------------- 
-mst: if I do "subtype 'Foo' => as 'Bar';" I get an empty condition and it dies
+BUGS
+-------------------------------------------------------------------------------
 
 -------------------------------------------------------------------------------
-TODO
+FEATURES
 -------------------------------------------------------------------------------
 
 - DDuncan's Str types
 
-subtype 'Str' 
-    => as 'Value' 
-    => where { Encode::is_utf8( $_[0] ) or $_[0] !~ m/[^0x00-0x7F]/x } 
+subtype 'Str'
+    => as 'Value'
+    => where { Encode::is_utf8( $_[0] ) or $_[0] !~ m/[^0x00-0x7F]/x }
     => optimize_as { defined($_[0]) && !ref($_[0]) };
 
-subtype 'Blob' 
-    => as 'Value' 
-    => where { !Encode::is_utf8( $_[0] ) } 
+subtype 'Blob'
+    => as 'Value'
+    => where { !Encode::is_utf8( $_[0] ) }
     => optimize_as { defined($_[0]) && !ref($_[0]) };
 
-
-- should handle some moose-specific options in &Moose::Meta::Class::create
-  things like roles, and method modifiers (although those can probably be 
-  ignored if i want to)
-
 - type unions
 
-Add support for doing it with Classes which do not have 
+Add support for doing it with Classes which do not have
 a type constraint yet created
 
 - type intersections
@@ -42,78 +35,14 @@ Mostly just for Roles
 - proxy attributes
 
 a proxied attribute is an attribute
-which looks like an attribute, 
-talks like an attribute, smells 
-like an attribute,.. but if you 
-look behind the curtain,.. its 
+which looks like an attribute,
+talks like an attribute, smells
+like an attribute,.. but if you
+look behind the curtain,.. its
 over there.. in that other object
 
 (... probably be a custom metaclass)
 
-- compile time extends
-
-[00:39]        sri         but maybe a better syntax for compile time extends
-[00:39]        stevan  I have been pondering that actually
-[00:39]        sri         use Moose extends => Foo::Bar
-[00:40]        stevan  I think now that we have the Sub::Exporter stuff 
-                    in, that kinda thing should be pretty easy
-
-nothingmuch notes that all the constructs should be supported in the entirety of the use clause:
-
-    use Moose (
-        has => foo (
-            ....
-        ),
-    );
-
-and that if this usage style is used nothing is exported to the namespace.
-
-- default should dclone()
-
-- subtype $anon_subtype => where { ... }
-
-[22:56]        stevan  sub mst_doesnt_like_to_type { (shift)->meta->attr->type_contstraint }
-[22:57]        mst     err
-[22:57]        stevan  :P
-[22:57]        stevan  are you wanting to reuse it or something?
-[22:57]        stevan  my $subtype = subtype 'Something' => where { ... };
-[22:58]        stevan  then you can do isa => $subtype 
-[22:58]        mst     but I can't subtype it again
-[22:59]        stevan  mst: ahhh... 
-[22:59]        mst     well, I can. but it suddenly gets very "long way round" ish
-[23:00]        stevan  my $constraint = Moose::Meta::TypeConstraint->new(
-[23:00]        stevan              name       => $name || '__ANON__',
-[23:00]        stevan              parent     => $parent,            
-[23:00]        stevan              constraint => $check,       
-[23:00]        stevan              message    => $message,    
-[23:00]        stevan          );
-[23:00]        stevan  yeah thats kinda the long way
-[23:00]        stevan  mst: what would you like it to be?
-[23:00]        mst     $parent = find_type_constraint($parent) if defined $parent;
-[23:00]        mst     if $parent is already a type constraint
-[23:00]        mst     skip that bit
-[23:00]        stevan  hmm
-[23:00]        mst     should be all you need to change
-[23:00]        stevan  yeah
-[23:01]        stevan  so you can then say 
-[23:01]        stevan  subtype $anon => where { ... };
-[23:01]        mst     right
-[23:01]        stevan  ok
-
-- method keyword
-
-[23:37]        mst     more seriously, I'd still like a "method" keyword or something
-[23:37]        mst     method 'foo' => sub { ... };
-[23:38]        stevan  what would it do more than sub foo { ... }?
-[23:39]        stevan  I would like multimethods actually
-[23:39]        mst     almost exactly nothing, to begin with
-[23:39]        stevan  but thats just cause I love CLOS and am reading a book on Dylan now
-[23:40]        stevan  keyword squating :)
-[23:40]        mst     but if we need to hook stuff later it's bloody handy to already have people writing it that way
-[23:40]        mst     right
-...
-[23:49]        mst     oh, also: method 'has' => sub { ... } could squelch the redefine warning
-  
 - local coerce
 
 [13:16]        mst     stevan: slight problem with coerce
@@ -121,7 +50,7 @@ and that if this usage style is used nothing is exported to the namespace.
 [13:17]        mst     so if I'm trying to declare it cast-style per-source-class rather than per-target-class
 [13:17]        mst     I am extremely screwed
 [13:17]        stevan  yes
-[13:17]        stevan  they are not class specific 
+[13:17]        stevan  they are not class specific
 [13:18]        stevan  they are attached to the type constraint itself
 [13:18]        *       stevan ponders anon-coercion-metaobjects
 [13:18]        mst     yes, that's fine
@@ -140,9 +69,82 @@ and that if this usage style is used nothing is exported to the namespace.
 [13:32]        mst     stevan: I want to be able to say in package Bar
 [13:32]        mst     stevan: coerce_to 'Foo' via { ... };
 [13:32]        mst     etc.
-[13:53]        stevan  hmm  
-  
-  
+[13:53]        stevan  hmm
+
+-------------------------------------------------------------------------------
+INTERNALS
+-------------------------------------------------------------------------------
+
+- rationalize all the get_X methods for classes (and roles)
+
+We have get_attribute, get_attributes_list, get_all_attributes,
+etc. First, we need to make the method names consistent. If something
+returns an attribute vs a name, that needs to be clear from the method
+name. We also need to make sure that local vs. "entire inheritance
+chain" is clear from the name.
+
+Finally, kill all the public get_X_map methods. The hashref it returns
+is the internal reference, and the fact that it _is_ a hashref is just
+an implementation detail.
+
+This is mostly a CMOP change.
+
+- Metaclass constructors
+
+There's a _lot_ of different conventions in here. Some things to consider:
+
+* new vs _new
+* allowing new( 'name', %args ) vs ( name => 'name', %args )
+* Method->wrap vs Method->new
+
+- Role & Class
+
+These two share a _lot_ of logic, but it's not via shared code. Maybe
+implement some sort of role-lit internal thing so we can have a
+"HasAttributes" and "HasMethods" role for classes and roles.
+
+- Moose::Meta::TypeConstraint::Parameter{izable,ized}
+
+The relationship between these two classes is very odd. In particular,
+this line in Parameterized is insane:
+
+    foreach my $type (Moose::Util::TypeConstraints::get_all_parameterizable_types()) {
+
+Why does it need to loop through all parameterizable types? Shouldn't
+it know which parameterizable type it "came from"?
+
+- Moose::Util::TypeConstraints vs Moose::Meta::Type{Coercion,Constraint}
+
+The Util module has _way_ too much functionality. It needs to be
+refactored so it's a thin sugar layer on top of the meta API. As it
+stands now, it does things like parse type names (and determine if
+they're valid), manage the registry, and much more.
+
+- Moose::Meta::Role::Application::*
+
+These class names are hardcoded throughout Moose, making replacing
+them very difficult.
+
+- Moose::Meta::Role & attributes
+
+The way a role stores attributes is nasty and not very
+introspectable. It should store some sort of object, possibly one that
+knows how to turn itself into a "real" attribute.
+
+- Anything with a _(meta)?class method
+
+Every method that returns a class name needs to become a rw attribute
+that can be set via the constructor.
+
+- The Moose::Error stuff
+
+This is sort of half-implemented. We still use Carp directly, and the
+internals can't decide how to throw an error (is it
+Moose->throw_error, __PACKAGE__->throw_error, what?).
+
+The internals need to be made consistent before we expose this to the
+rest of the world.
+
 -------------------------------------------------------------------------------
 TO PONDER
 -------------------------------------------------------------------------------
@@ -150,8 +152,8 @@ TO PONDER
 - Moose "strict" mode
 
 use Moose 'strict'; This would allow us to have all sort of expensive tests
-which can be turned off in prod.     
-        
+which can be turned off in prod.
+
 - Moose::Philosophy.pod
 
 To explain Moose from a very high level
@@ -159,6 +161,6 @@ To explain Moose from a very high level
 - moosedoc
 
 We certainly have enough meta-information to make pretty complete POD docs.
-        
-        
-        
+
+
+