Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision 3648d98da574a68632d9d6b4d45ac64e674d5106)
+++ src/InitTweak/InitTweak.cc	(revision d66e7b7b110efcf99370d5d03e97d25793df250a)
@@ -5,4 +5,6 @@
 #include <memory>                  // for __shared_ptr
 
+#include "AST/Expr.hpp"
+#include "AST/Stmt.hpp"
 #include "AST/Type.hpp"
 #include "Common/PassVisitor.h"
@@ -27,6 +29,4 @@
 #include "Tuples/Tuples.h"         // for Tuples::isTtype
 
-class UntypedValofExpr;
-
 namespace InitTweak {
 	namespace {
@@ -433,4 +433,17 @@
 			assert( false );
 		}
+
+		// template<typename CallExpr>
+		// const ast::Expr * callArg( const CallExpr * call, unsigned int pos ) {
+		// 	if( pos >= call->args.size() ) {
+		// 		assertf( false, "getCallArg for argument that doesn't exist: (%u); %s.", 
+		// 			pos, toString( call ).c_str() );
+		// 	}
+		// 	for ( const ast::Expr * arg : call->args ) {
+		// 		if ( pos == 0 ) return arg;
+		// 		--pos;
+		// 	}
+		// 	assert( false );
+		// }
 	}
 
@@ -452,4 +465,24 @@
 			assertf( false, "Unexpected expression type passed to getCallArg: %s", toString( callExpr ).c_str() );
 		}
+	}
+	const ast::Expr * getCallArg( const ast::Expr * call, unsigned pos ) {
+		assert(!"implemented; needs to build AST/Expr.cpp");
+		// if ( auto app = dynamic_cast< const ast::ApplicationExpr * >( call ) ) {
+		// 	return callArg( app, pos );
+		// } else if ( auto untyped = dynamic_cast< const ast::UntypedExpr * >( call ) ) {
+		// 	return callArg( untyped, pos );
+		// } else if ( auto tupleAssn = dynamic_cast< const ast::TupleAssignExpr * >( call ) ) {
+		// 	const std::list<ast::ptr<ast::Stmt>>& stmts = tupleAssn->stmtExpr->stmts->kids;
+		// 	assertf( ! stmts.empty(), "TupleAssignExpr missing statements." );
+		// 	const ExprStmt * stmt = strict_dynamic_cast< const ast::ExprStmt * >( stmts.back() );
+		// 	const TupleExpr * tuple = strict_dynamic_cast< const ast::TupleExpr * >( stmt->expr );
+		// 	assertf( ! tuple->exprs.empty(), "TupleAssignExpr has empty tuple expr.");
+		// 	return getCallArg( tuple->exprs.front(), pos );
+		// } else if ( auto ctor = dynamic_cast< const ast::ImplicitCopyCtorExpr * >( call ) ) {
+		// 	return getCallArg( ctor->callExpr, pos );
+		// } else {
+		// 	assertf( false, "Unexpected expression type passed to getCallArg: %s", 
+		// 		toString( call ).c_str() );
+		// }
 	}
 
@@ -516,9 +549,9 @@
 	const ast::Type* getPointerBase( const ast::Type* t ) {
 		assert(!"needs to build Type.cpp before inclusion");
-		// if ( const ast::PointerType* p = dynamic_cast< const ast::PointerType* >( t ) ) {
+		// if ( const auto * p = dynamic_cast< const ast::PointerType * >( t ) ) {
 		// 	return p->base;
-		// } else if ( const ast::ArrayType* a = dynamic_cast< const ast::ArrayType* >( t ) ) {
+		// } else if ( const auto * a = dynamic_cast< const ast::ArrayType * >( t ) ) {
 		// 	return a->base;
-		// } else if ( const ast::ReferenceType* r = dynamic_cast< const ast::ReferenceType* >( t ) ) {
+		// } else if ( const auto * r = dynamic_cast< const ast::ReferenceType * >( t ) ) {
 		// 	return r->base;
 		// } else return nullptr;
Index: src/InitTweak/InitTweak.h
===================================================================
--- src/InitTweak/InitTweak.h	(revision 3648d98da574a68632d9d6b4d45ac64e674d5106)
+++ src/InitTweak/InitTweak.h	(revision d66e7b7b110efcf99370d5d03e97d25793df250a)
@@ -81,4 +81,5 @@
 	/// returns the argument to a call expression in position N indexed from 0
 	Expression *& getCallArg( Expression * callExpr, unsigned int pos );
+	const ast::Expr * getCallArg( const ast::Expr * call, unsigned pos );
 
 	/// returns the base type of a PointerType or ArrayType, else returns NULL
