--- a/@mp/private/__mp__.m
+++ b/@mp/private/__mp__.m
@@ -1,23 +1,30 @@
-function out = mp(x, y, recurse)
-%MP multiple  precision class internal constructor.
-%   p = mp(x, y) creates a mp object from the matrices x and y,
-%   where x contains the double to be converted into an mp object
-%         y contains the precision
+function out = __mp__(x, y, recurse)
+  %# MP multiple  precision class internal constructor. This one
+  %# expects an cell array of strings, and should implement minimalist
+  %# parsing of values like 'pi', ... For the moment, it is not safe
+  %# wih respect to values like Inf and NaN and will complain if not
+  %# used on an object previously created by mp.
 
   if (~ recurse)
     warning ('mp: this call is not safe with respect to NaN and Inf');
   end
-  
+
   precision = int32 (max (y(:)));
   
-  out_rval = cell (size (x));
-  out_ival = cell (size (x));
+  [out_rval, out_ival] = deal (cell (size (x)));
+  
+  for ii = (1:numel (x))
+    x{ii};
+    %# minimalist parser ...
+    if (any (strfind (lower (ans), 'pi')))
+      out_rval{ii} = mpfr_pi (double (precision));
+    else
+      [str, exponent] = mpfr_construct_cd (ans, double (precision));
+      out_rval{ii} = mpExpForm (mpAddDecimal (str), exponent);
+    end
+  end
 
-  for ii = (1:numel (x))
-    [str, exponent] = mpfr_construct_cd (x{ii}, double (precision));
-    out_rval{ii} = mpExpForm (mpAddDecimal (str), exponent);
-  end
-  
+  %# transform the struct into an object
   out = mp (struct ('rval', out_rval, ...
 		    'ival', out_ival, ...
 		    'precision', precision));