On Thu May 10 06:12:35 2012, grond...@yahoo.fr wrote: > I failed converting an object derived from Int using bless: > > code: > > class Foo is Int {}; sub somefoo returns Foo { Foo.bless: 13 }; say > somefoo.WHAT; > > Error: > rakudo d61049: OUTPUT«Type check failed for return value in sub > somefoo at /tmp/42g2EnvfAS:1 in block <anon> at > /tmp/42g2EnvfAS:1»
Rakudo is actually correct here: in Perl 6, bless takes an already-built object, and does initialization stuff (in particular it calls BUILDALL, which in turns calls the BUILD submethods or does the default attribute initialization). So Foo.bless: 13 actually returns the 13, and that fails your type check. So, how does one write the constructor for a class that inherits from a value type? A rakudo-specific answer is that you can write class Foo is Int { method new($x) { nqp::box_i($x, self) } } The spec is silent on how to do it in a more general way. A possible solution is to force all value types to provide a constructor that you can inherit. So Int.new(4) would return a 4, but class Foo is Int { }; Foo.new(4) would return a 4 but of type Foo. Cheers, Moritz