class_docstr: Replaces **2 by a call to numpy.square.
  
  >>> import gast as ast
  >>> from pythran import passmanager, backend
  >>> node = ast.parse('a**2')
  >>> pm = passmanager.PassManager("test")
  >>> _, node = pm.apply(Square, node)
  >>> print(pm.dump(backend.Python, node))
  import numpy as __pythran_import_numpy
  __pythran_import_numpy.square(a)
  >>> node = ast.parse('__pythran_import_numpy.power(a,2)')
  >>> pm = passmanager.PassManager("test")
  >>> _, node = pm.apply(Square, node)
  >>> print(pm.dump(backend.Python, node))
  import numpy as __pythran_import_numpy
  __pythran_import_numpy.square(a)
code: def expand_pow(self, node, n):
      if n == 0:
          return ast.Constant(1, None)
      elif n == 1:
          return node
      else:
          node_square = self.replace(node)
          node_pow = self.expand_pow(node_square, n >> 1)
          if n & 1:
              return ast.BinOp(
                  node_pow, ast.Mult(), copy.deepcopy(node)
              )
          else:
              return node_pow
  
file_path: pythran/pythran/optimizations/square.py
imports: from pythran.passmanager import Transformation
  from pythran.analyses.ast_matcher import ASTMatcher, AST_any
  from pythran.conversion import mangle
  from pythran.utils import isnum
  import gast
  import copy
label_desc: Use image node_id 4 for calling the Square obj's underlying member method code with example usage: obj.expand_pow(node, n) and returns: ast, node, ast, node_pow